"""
JSON 病历数据转换为自然语言文本
用于 HuaTuoGPT 输入（HuaTuoGPT 需要自然语言而非 JSON）
"""
from typing import Dict, Any, List


def convert_record_to_natural_language(record_data: Dict[str, Any]) -> str:
    """
    将 JSON 病历数据转换为自然语言描述
    
    支持两种格式：
    1. 原始格式（嵌套对象：患者信息、病情信息等）
    2. 扁平格式（patient_name, chief_complaint 等）
    
    Args:
        record_data: JSON 格式的病历数据
        
    Returns:
        自然语言格式的病历描述
    """
    lines = []
    
    # 标题
    lines.append("=" * 50)
    lines.append("病历摘要")
    lines.append("=" * 50)
    lines.append("")
    
    # 🔍 检测数据格式
    # 格式1：原始格式（患者信息、病情信息等嵌套对象）
    if '患者信息' in record_data:
        patient_info = record_data.get('患者信息', {})
        condition_info = record_data.get('病情信息', {})
        
        # 1. 患者基本信息
        lines.append("【患者信息】")
        patient_name = patient_info.get('姓名', '未知')
        patient_age = patient_info.get('年龄', '未知')
        patient_gender = patient_info.get('性别', '未知')
        lines.append(f"患者姓名：{patient_name}")
        lines.append(f"年龄：{patient_age}")
        lines.append(f"性别：{patient_gender}")
        
        department = patient_info.get('科别', '未知')
        visit_date = patient_info.get('就诊日期', '未知')
        card_number = patient_info.get('就诊卡号', '')
        lines.append(f"就诊科室：{department}")
        lines.append(f"就诊日期：{visit_date}")
        if card_number:
            lines.append(f"就诊卡号：{card_number}")
        lines.append("")
        
        # 2. 主诉
        chief_complaint = condition_info.get('主诉', '无')
        lines.append("【主诉】")
        lines.append(chief_complaint)
        lines.append("")
        
        # 3. 现病史
        present_illness = condition_info.get('现病史', '无')
        lines.append("【现病史】")
        lines.append(present_illness)
        lines.append("")
        
        # 4. 既往史
        past_history = condition_info.get('既往史', '无')
        lines.append("【既往史】")
        lines.append(past_history)
        lines.append("")
        
        # 5. 过敏史
        allergy_history = condition_info.get('过敏史', '无')
        lines.append("【过敏史】")
        lines.append(allergy_history)
        lines.append("")
        
        # 6. 个人史
        personal_history = condition_info.get('个人史')
        if personal_history:
            lines.append("【个人史】")
            lines.append(personal_history)
            lines.append("")
        
        # 7. 体格检查
        physical_exam = condition_info.get('体格检查', '无')
        lines.append("【体格检查】")
        lines.append(physical_exam)
        lines.append("")
        
        # 8. 辅助检查
        auxiliary_exam = condition_info.get('辅助检查')
        if auxiliary_exam and auxiliary_exam != '无。':
            lines.append("【辅助检查】")
            lines.append(auxiliary_exam)
            lines.append("")
        
        # 9. 诊断
        diagnosis_str = condition_info.get('诊断', '')
        if diagnosis_str:
            lines.append("【诊断】")
            # 解析诊断字符串（格式：1.痛风性关节炎 2.胃炎?）
            diagnosis_items = [d.strip() for d in diagnosis_str.split(' ') if d.strip() and not d.strip().isdigit()]
            for item in diagnosis_items:
                # 移除前导数字和点
                item = item.lstrip('0123456789.').strip()
                if item:
                    lines.append(f"- {item}")
            lines.append("")
        
        # 10. 用药信息
        medications = record_data.get('用药信息', [])
        if medications:
            lines.append("【用药信息】")
            for i, med in enumerate(medications, 1):
                med_name = med.get('名称', '未知药物')
                spec = med.get('规格', '')
                usage = med.get('用法', '')
                dosage = med.get('剂量', '')
                duration = med.get('天数', '')
                
                med_line = f"{i}. {med_name}"
                if spec:
                    med_line += f" {spec}"
                if dosage:
                    med_line += f"，剂量：{dosage}"
                if usage:
                    med_line += f"，用法：{usage}"
                if duration:
                    med_line += f"，{duration}"
                
                lines.append(med_line)
            lines.append("")
        
        # 11. 嘱托与注意事项
        instructions = record_data.get('嘱托与注意事项', [])
        if instructions:
            lines.append("【嘱托与注意事项】")
            for i, inst in enumerate(instructions, 1):
                lines.append(f"{i}. {inst}")
            lines.append("")
        
        # 12. 医生签名
        doctor_info = record_data.get('医生信息', {})
        doctor_name = doctor_info.get('医生签名')
        if doctor_name:
            lines.append(f"医生签名：{doctor_name}")
            lines.append("")
    
    # 格式2：扁平格式（兼容旧代码）
    else:
        # 1. 患者基本信息
        lines.append("【患者信息】")
        patient_name = record_data.get('patient_name', '未知')
        patient_age = record_data.get('patient_age', '未知')
        patient_gender = record_data.get('patient_gender', '未知')
        lines.append(f"患者姓名：{patient_name}")
        lines.append(f"年龄：{patient_age}岁")
        lines.append(f"性别：{patient_gender}")
        
        department = record_data.get('department', '未知')
        visit_date = record_data.get('visit_date', '未知')
        lines.append(f"就诊科室：{department}")
        lines.append(f"就诊日期：{visit_date}")
        lines.append("")
        
        # 2. 主诉
        chief_complaint = record_data.get('chief_complaint', '无')
        lines.append("【主诉】")
        lines.append(chief_complaint)
        lines.append("")
        
        # 3. 现病史
        present_illness = record_data.get('present_illness', '无')
        lines.append("【现病史】")
        lines.append(present_illness)
        lines.append("")
        
        # 4. 既往史
        past_history = record_data.get('past_history', '无')
        lines.append("【既往史】")
        lines.append(past_history)
        lines.append("")
        
        # 5. 过敏史
        allergy_history = record_data.get('allergy_history', '无')
        lines.append("【过敏史】")
        lines.append(allergy_history)
        lines.append("")
        
        # 6. 个人史
        personal_history = record_data.get('personal_history')
        if personal_history:
            lines.append("【个人史】")
            lines.append(personal_history)
            lines.append("")
        
        # 7. 体格检查
        physical_exam = record_data.get('physical_exam', '无')
        lines.append("【体格检查】")
        lines.append(physical_exam)
        lines.append("")
        
        # 8. 辅助检查
        auxiliary_exam = record_data.get('auxiliary_exam')
        if auxiliary_exam and auxiliary_exam != '无。':
            lines.append("【辅助检查】")
            lines.append(auxiliary_exam)
            lines.append("")
        
        # 9. 诊断
        diagnosis = record_data.get('diagnosis', [])
        if diagnosis:
            lines.append("【诊断】")
            for i, diag in enumerate(diagnosis, 1):
                lines.append(f"{i}. {diag}")
            lines.append("")
        
        # 10. 用药信息
        raw_data = record_data.get('raw_data', {})
        medications = raw_data.get('用药信息', [])
        if medications:
            lines.append("【用药信息】")
            for i, med in enumerate(medications, 1):
                med_name = med.get('名称', '未知药物')
                spec = med.get('规格', '')
                usage = med.get('用法', '')
                duration = med.get('天数', '')
                
                med_line = f"{i}. {med_name}"
                if spec:
                    med_line += f" {spec}"
                if usage:
                    med_line += f"，{usage}"
                if duration:
                    med_line += f"，{duration}"
                
                lines.append(med_line)
            lines.append("")
        
        # 11. 医嘱
        instructions = raw_data.get('医嘱', [])
        if instructions:
            lines.append("【医嘱】")
            for i, inst in enumerate(instructions, 1):
                lines.append(f"{i}. {inst}")
            lines.append("")
        
        # 12. 医生签名
        doctor_name = record_data.get('doctor_name')
        if doctor_name:
            lines.append(f"医生签名：{doctor_name}")
            lines.append("")
    
    lines.append("=" * 50)
    
    # 合并为单个字符串
    return '\n'.join(lines)


def build_huatuogpt_prompt(natural_language_record: str) -> str:
    """
    构建 HuaTuoGPT 评估提示词
    
    Args:
        natural_language_record: 自然语言格式的病历
        
    Returns:
        HuaTuoGPT 提示词
    """
    prompt = f"""你是一位专业的医疗质量评估专家，请对以下病历进行专业评估，重点关注医学合理性和精准性。

{natural_language_record}

请从以下维度进行评估：

1. **医学合理性**（25分）
   - 诊断与症状是否吻合？
   - 用药是否符合诊断？
   - 剂量和疗程是否合理？

2. **临床精准性**（25分）
   - 生命体征数值是否在正常范围？
   - 检查结果解读是否准确？
   - 诊断是否精准？

3. **逻辑一致性**（25分）
   - 主诉、现病史、诊断逻辑是否连贯？
   - 既往史与当前诊疗是否冲突？
   - 用药之间是否有配伍禁忌？

4. **医疗安全性**（25分）
   - 是否存在用药风险？
   - 过敏史是否被重视？
   - 是否有漏诊误诊风险？

请按以下格式输出评估结果（必须严格遵守格式）：

【评分】
医学合理性：X分（0-25）
临床精准性：X分（0-25）
逻辑一致性：X分（0-25）
医疗安全性：X分（0-25）
综合得分：X分（0-100）

【主要问题】
1. 问题描述
2. 问题描述
...

【改进建议】
1. 具体建议
2. 具体建议
...

【总结】
简明扼要的评估总结（50字内）。

请开始评估："""
    
    return prompt


def extract_scores_from_huatuogpt_response(response: str) -> Dict[str, int]:
    """
    从 HuaTuoGPT 响应中提取分数
    
    Args:
        response: HuaTuoGPT 的评估响应
        
    Returns:
        包含各维度分数的字典
    """
    import re
    
    scores = {
        'medical_rationality_score': 0,
        'clinical_accuracy_score': 0,
        'logic_consistency_score': 0,
        'safety_score': 0,
        'overall_score': 0
    }
    
    # 提取分数的正则表达式
    patterns = {
        'medical_rationality_score': r'医学合理性[：:]\s*(\d+)\s*分',
        'clinical_accuracy_score': r'临床精准性[：:]\s*(\d+)\s*分',
        'logic_consistency_score': r'逻辑一致性[：:]\s*(\d+)\s*分',
        'safety_score': r'医疗安全性[：:]\s*(\d+)\s*分',
        'overall_score': r'综合得分[：:]\s*(\d+)\s*分'
    }
    
    for key, pattern in patterns.items():
        match = re.search(pattern, response)
        if match:
            try:
                scores[key] = int(match.group(1))
            except ValueError:
                pass
    
    # 如果没找到综合得分，计算总和
    if scores['overall_score'] == 0:
        scores['overall_score'] = (
            scores['medical_rationality_score'] +
            scores['clinical_accuracy_score'] +
            scores['logic_consistency_score'] +
            scores['safety_score']
        )
    
    return scores


def extract_issues_from_huatuogpt_response(response: str) -> List[str]:
    """
    从 HuaTuoGPT 响应中提取问题列表
    
    Args:
        response: HuaTuoGPT 的评估响应
        
    Returns:
        问题列表
    """
    import re
    
    # 查找【主要问题】部分
    issues_section = re.search(r'【主要问题】(.*?)【', response, re.DOTALL)
    if not issues_section:
        return []
    
    issues_text = issues_section.group(1).strip()
    
    # 提取编号列表项
    issues = re.findall(r'\d+\.\s*(.+?)(?=\n\d+\.|$)', issues_text, re.DOTALL)
    
    # 清理空白
    issues = [issue.strip() for issue in issues if issue.strip()]
    
    return issues


def extract_suggestions_from_huatuogpt_response(response: str) -> List[str]:
    """
    从 HuaTuoGPT 响应中提取建议列表
    
    Args:
        response: HuaTuoGPT 的评估响应
        
    Returns:
        建议列表
    """
    import re
    
    # 查找【改进建议】部分
    suggestions_section = re.search(r'【改进建议】(.*?)【', response, re.DOTALL)
    if not suggestions_section:
        return []
    
    suggestions_text = suggestions_section.group(1).strip()
    
    # 提取编号列表项
    suggestions = re.findall(r'\d+\.\s*(.+?)(?=\n\d+\.|$)', suggestions_text, re.DOTALL)
    
    # 清理空白
    suggestions = [sug.strip() for sug in suggestions if sug.strip()]
    
    return suggestions


def extract_summary_from_huatuogpt_response(response: str) -> str:
    """
    从 HuaTuoGPT 响应中提取总结
    
    Args:
        response: HuaTuoGPT 的评估响应
        
    Returns:
        总结文本
    """
    import re
    
    # 查找【总结】部分
    summary_section = re.search(r'【总结】\s*(.*?)(?=\n\n|$)', response, re.DOTALL)
    if summary_section:
        return summary_section.group(1).strip()
    
    return "评估已完成，详见各维度评分。"

